package serveur;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import org.jbox2d.common.Vec2;
import org.jbox2d.dynamics.World;

public class Monde {

     
    private int largeur = 2000;
    private int hauteur = 2000;
    
    private static final Vec2 FORCE_GRAVITATION = new Vec2(0,0 );
    
	/**
	 * Create a JBox2D world.
	 */
    private final World world = new World(FORCE_GRAVITATION);
    
    private final Map<Integer,Objet2D> mapObject2D = new HashMap<>();
    
    private long derniere_maj;
    public Monde(){
    	
    }
    
    public void lancerMonde(){
    	derniere_maj = System.currentTimeMillis();
    }
    
    public boolean maj(){
    	
    	float temps_depuis_derniere_maj = (float) (System.currentTimeMillis() - derniere_maj);
    	if(temps_depuis_derniere_maj>0.1){
    		synchronized(mapObject2D){
    			for(Objet2D objet: mapObject2D.values()){
        			objet.maj();
        		}
    		}
    		
    		synchronized(world){
    			world.step(temps_depuis_derniere_maj, 8, 3);
    		}
        	
        	derniere_maj += (long) (temps_depuis_derniere_maj);
        	return true;
    	} else {
    		return false;
    	}
    	
    	
    }
    
    public Fantome ajouterFantome(){
    	Fantome fantome = new Fantome(500f, 500f);
    	ajouterObject2D(fantome);
    	return fantome;
    }
    
    public void ajouterObject2D(Objet2D objet2d){
    	synchronized(world){
    		objet2d.ajouterAuWorld(world);
    	}
    	synchronized(mapObject2D){
    		mapObject2D.put(objet2d.getId(),objet2d);
    	}
    	
    }
    
    public List<Integer> getIdObjetsToucheBox(Box box){
    	List<Integer> listeObjetsToucheBox = new LinkedList<>();
    	synchronized(mapObject2D){
        	for(Objet2D objet: mapObject2D.values()){
        		if(objet.toucheBox(box)){
        			listeObjetsToucheBox.add(objet.getId());
        		}
        	}
    	}

    	return listeObjetsToucheBox;
    }
    
    public Objet2D getObject2D(int id){
    	return mapObject2D.get(id);
    }
     
	public static void main(String[] args) {
		Monde monde = new Monde();
		Mur sol = new Mur(-10f, 0f, 1f, 10f);
		monde.ajouterObject2D(sol);
		
		Fantome fantome = new Fantome(20, 5);
		//fantome.setMouvementHorizontal(Mouvement.DROIT);
		monde.ajouterObject2D(fantome);
		
		monde.lancerMonde();
		while(true){
			
			if(monde.maj()){
				fantome.maj();
				System.out.println(fantome);
			}
			
		}
	}

	public int getLargeur() {
		return largeur;
	}

	public int getHauteur() {
		return hauteur;
	}

}
